import {
  LoadingController,
  ToastController,
  AlertController,
  Events,
  ModalController
} from "ionic-angular";

import { NavController } from "ionic-angular/navigation/nav-controller";
import { Api } from "../../providers/api-service";

export class HaokurBasePage {
  // export class HaokurBase {
  // 首次加载标识,解决didenter才执行请求引起的空白
  public firstLoadFlag: Boolean = true;

  // 加载中的弹窗激活状态...
  private loadingActive: Boolean = false;

  // 请求加载中提示弹窗
  private httpLoading;
  // private tipModalActive: Boolean = false;
  private toastActive: Boolean = false;

  // 刷新实例事件
  // private refresher;

  // 在子类组件中,需实例化这些类
  public navCtrl: NavController;
  public api: Api;
  public events: Events;
  public loadingCtrl: LoadingController;
  public toastCtrl: ToastController;
  public alertCtrl: AlertController;
  public modalCtrl: ModalController;
  public SocialShareComponent: any;

  // 子组件通用变量
  pSize: number = 10; // 一页的条数
  allLoad = false; // 是否全部加载

  //
  // private bindLoginCallbackFn;

  constructor(SocialShareComponent: any = null) {
    // 因为unsubscribe时需要找到同样的引用才能删除绑定的事件,而绑定的方法又必须有一个this引用
    this.SocialShareComponent = SocialShareComponent
  }

  /**
   * 请用pageLoad代替此方法
   */
  ionViewDidLoad() {
    this.pageLoad();
    this.pageEnter();
  }

  // 离开页面前,
  ionViewWillLeave() {
    this.loadingEnd();
    this.api && this.api.hideWait();
  }

  /**
   * 请用pageUnload代替此方法
   */
  ionViewWillUnload() {
    this.pageUnload();
  }

  /**
   * 请用pageEnter代替此方法
   */
  ionViewDidEnter() {
    if (this.firstLoadFlag) {
      this.firstLoadFlag = false;
      return;
    }
    this.pageEnter();
  }

  /**
   * 只需加载一次的数据,可缓存数据,
   * 实质是ionic的生命周期的ionViewDidLoad调用此方法
   */
  pageLoad() { }

  /**
   * 每次进入页面都需重新,
   * 实质是ionic的生命周期的ionViewDidEnter调用此方法
   */
  pageEnter() { }

  // 页面刷新,可不重写
  pageRefresh(refresher) {
    this.pageEnter();
    this.pageLoad();
    setTimeout(() => {
      this.pageRefreshDone(refresher);
    }, 600);
  }

  // 页面刷新完成
  pageRefreshDone(refresher) {
    refresher && refresher.complete();
  }

  /**
   * 绑定登录成功回调执行逻辑
   */
  loginSuccess() { }


  // 页面被销毁
  pageUnload() { }

  /**
   * 加载提示弹窗,需在使用的地方构造函数实例化一个public属性的loadingCtrl,如下:
   * ```
   * constructor(
   *  loadingCtrl:LoadingController
   * ){}
   * ```
   * @param content 等待中提示信息
   */
  loadingStart(content = "请稍候...") {
    if (!this.loadingCtrl) {
      return console.error("请在组件中引入loadingController,并实例化为loadingCtrl");
    }
    if (this.loadingActive) {
      return;
    }
    this.loadingActive = true;
    this.httpLoading = this.loadingCtrl.create({
      content
    });
    this.httpLoading.present();
  }

  /**
   *  加载完成,加载提示消失
   */
  loadingEnd() {
    if (this.httpLoading) {
      this.httpLoading.dismiss();
      this.httpLoading = null;
      this.loadingActive = false;
    }
  }

  /**
   * 普通弹窗,只有确定按钮,需在使用的地方构造函数实例化一个public属性的alertCtrl
   * ```
   * constructor(
   *  alertCtrl:AlertController
   * ){}
   * ```
   * @param message 弹窗内容
   * @param title 弹窗标题
   * @param btn 弹窗按钮文字
   */
  alert(message = "内容", title = "", btn = '确定') {
    return new Promise((resolve, reject) => {
      if (!this.alertCtrl) {
        console.warn("请在page实例化一个public的alertCtrl");
      }
      let alert = this.alertCtrl.create({
        title: title,
        subTitle: message,
        buttons: [{
          text: btn,
        }],
      });
      alert.present();
      alert.onDidDismiss(() => {
        resolve('dismiss')
      })
    })
  }

  /**
   * 确认弹窗,需在使用的地方实例化一个public属性的alertCtrl
   * ```
   * constructor(
   *  alertCtrl:AlertController
   * ){}
   * ```
   * @param param0 {title:弹窗标题,message:'弹窗内容'}
   */
  confirm({ title: title = "标题", message: message = "" } = {}) {
    return new Promise((resolve, reject) => {
      if (!this.alertCtrl) {
        console.warn("请在page实例化一个public的alertCtrl")
      }
      let confirm = this.alertCtrl.create({
        title,
        message,
        buttons: [
          {
            text: "取消",
            handler: () => {
              reject("cancel");
            }
          },
          {
            text: "确定",
            handler: () => {
              resolve("ok");
            }
          }
        ]
      });
      confirm.present();
    });
  }

  /**
   * 小小轻提示,需在使用的地方实例化一个public属性的toastCtrl
   * ```
   * constructor(
   *  toastCtrl:ToastController
   * ){}
   * ```
   * @param msg 提示气泡内容
   * @param showTimes 气泡持续时间,默认1.5s
   */
  toast(msg, showTimes = 1500) {
    this.showToast(msg, showTimes, 'mini-toast')
  }

  /**
   * ionic框架提供的默认样式的提示气泡,需在使用的地方实例化一个public属性的toastCtrl
   * ```
   * constructor(
   *  toastCtrl:ToastController
   * ){}
   * ```
   * @param msg 提起气泡内容
   * @param showTimes 气泡持续时间,默认1.5s
   * @param cssClass 气泡自定义class
   */
  showToast(msg, showTimes = 1500, cssClass = '') {
    if (this.toastActive || typeof msg !== "string") return;
    if (!this.toastCtrl) {
      console.warn('请在page实例化一个public的toastCtrl')
    }
    this.toastActive = true;
    // console.log('错误提示')
    let toast = this.toastCtrl.create({
      message: msg,
      position: cssClass ? "middle" : "top",
      duration: showTimes,
      cssClass,
    });
    toast.present();
    toast.onDidDismiss(() => {
      this.toastActive = false;
    });
  }

  /**
   * qq,微信和微博第三方分享,调用从底部弹出分享窗口
   * 注意:必须先在页面构造函数实例化SocialShareComponent
   * ```
   * // 实例化SocialShareComponent
   * constructor(){
   *  super(SocialShareComponent)
   * }
   * 
   * // 分享配置结构
   * shareConfig = {
   *  title:'分享的标题',
   *  url:'分享的链接地址',
   *  description:'分享的描述信息',
   *  image:'分享的图片'
   * }
   * ```
   * @param shareConfig 分享配置
   * @param cancel 分享地址取消时的回调,可不传
   */
  commonShare(shareConfig = {}, cancel = null) {
    console.log(shareConfig)
    if (!this.modalCtrl) {
      console.warn('请在调用该方法的地方实例一个public的modalCtrl');
    }
    return new Promise((resolve, reject) => {
      let socialShareModal = this.modalCtrl.create(this.SocialShareComponent,
        {
          config: shareConfig,
          success: () => {
            resolve()
          },
          fail: err => {
            console.log(err)
            reject(err)
          },
          cancel: () => {
            socialShareModal.dismiss()
            cancel && cancel()
          }
        },
        {
          cssClass: 'share-modal',
        }
      )
      socialShareModal.present()
    })
  }

  /**
   * log打印信息,替代console.log,方便全局开关打印信息,建议及时清理
   */
  log(...args) {
    console.log(args)
  }

  /**
   * log警告信息
   */
  warn(...args) {
    console.error(args)
  }

  /**
   * 微信分享页面的app下载app提示
   */
  showAppDownGuide() {
    this.confirm({ title: "app下载提示", message: "下载app查看更多" })
      .then(() => {
        console.log('去下载')
        // window.location.href = ''
      })
      .catch(err => { })
  }

}
